package sample;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.stage.DirectoryChooser;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.Scanner;
import java.util.function.Consumer;


public class Controller implements Initializable {


    private SimpleTools simpleTools = new SimpleTools();

    @FXML
    private Stage stage;

    public Stage getStage() {
        return stage;
    }

    public void setStage(Stage stage) {
        this.stage = stage;
    }

    @FXML
    private TextField tf_appid;
    @FXML
    private TextField tf_appkey;
    @FXML
    private TextField tf_bundleid;
    @FXML
    private TextField tf_version;
    @FXML
    private TextField tf_platform;
    @FXML
    private TextField tf_inputSymbol;
    @FXML
    private Button bt_inputSymbol;
    @FXML
    private TextField tf_inputMapping;
    @FXML
    private Button bt_inputMapping;
    @FXML
    private Button bt_commit;


    public Controller() {

    }


    //创建fxml中为button设置的监听方法
//    public void getInputSymbolPath(ActionEvent actionEvent) {
//    }
    //创建fxml中为button设置的监听方法
//    public void getMappingPath(ActionEvent actionEvent) {
//    }



    @Override
    public void initialize(URL location, ResourceBundle resources) {
        initView();
        setClickListenner();
    }


    private void initView() {
//        tf_platform.setLayoutX(50);
        //设置提示，Node结点都有setTooltip方法
//        Tooltip tip = new Tooltip("这是提示");//括号里面是默认文本
//        tip.setStyle();//提示也可以设置样式
//        tf_platform.setTooltip(tip);
//        tf_platform.setPromptText("请输入7个字以下");//设置隐式提示
//        text.setFocusTraversable(false);//关闭初始焦点

        //设置提示
        tf_appid.setPromptText("bugly平台分配的appid");//设置隐式提示
        tf_appkey.setPromptText("bugly平台分配的appKey");//设置隐式提示
        tf_bundleid.setPromptText("应用包名com.xxx.xxx.xxx");//设置隐式提示
        tf_version.setPromptText("app的版本号如：5.6.6");//设置隐式提示
        tf_platform.setPromptText("平台类型Android or iOS");//设置隐式提示
        tf_inputSymbol.setPromptText("mapping文件所在目录");//设置隐式提示
        tf_inputMapping.setPromptText("mapping文件路径");//设置隐式提示

    }


    private void setClickListenner() {

        //选择maoping文件所在目录路径
        bt_inputSymbol.setOnAction(event -> selectDirectoryPath());
        //选择mapping文件路径
        bt_inputMapping.setOnAction(event -> selectFilePath());
        //提交按钮
        bt_commit.setOnAction(event -> commit(event));
    }

    /**
     * 选择mapping文件路径
     */
    private void selectFilePath() {
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("请选择mapping.txt文件");
        if (!"".equals(tf_inputSymbol.getText())){
            File file = new File(tf_inputSymbol.getText());
            if(file.isDirectory()){
                //设置打开初始地址
                fileChooser.setInitialDirectory(file);
            }
        }else{
            //默认打开E:盘
            fileChooser.setInitialDirectory(new File("E:" + File.separator));
        }
        //添加过滤
        FileChooser.ExtensionFilter mappingFilter = new FileChooser.ExtensionFilter(
                "mapping files (*.txt)", "*.txt");
        fileChooser.getExtensionFilters().add(mappingFilter);
        File file = fileChooser.showOpenDialog(stage);
        if (file != null) {
            String path =file.getAbsolutePath();
            System.out.println("选择的mapping文件的地址为：" + path);
            tf_inputMapping.setText(path);
        }

        /*
         //多文件过滤及选择逻辑如下
        //过滤选择文件类型
//        fileChooser.getExtensionFilters().addAll(new ExtensionFilter("图片类型","*.jpg","*.png"),
//                new ExtensionFilter("文本类型","*.txt"));
        //显示选择窗口,获取选中文件
        //多文件选择
        List<File> list =  fileChooser.showOpenMultipleDialog(new Stage());
        if(list == null){
            return;
        }
        集合的forEach方法 传入一个Consumer接口 重写Consumer接口的accept（T t）方法
        forEach方法使用增强for循环使集合的每个元素执行accept方法
        list.forEach(new Consumer<File>() {
            @Override
            public void accept(File t) {
                System.out.println(t.getAbsolutePath());

            }
        });*/

    }

    /**
     * 选择maoping文件所在目录路径
     */
    private void selectDirectoryPath() {
        DirectoryChooser directoryChooser=new DirectoryChooser();
        File file = null; //路径
        //如果当前输入框已经存在有路径，那么直接打开当前路径
        if (!"".equals(tf_inputMapping.getText())) {
            file = new File(tf_inputMapping.getText());
            //设置打开初始地址
            directoryChooser.setInitialDirectory(file);
        }else{
            //如果输入框没有路径，那么打开上面那个输入框中的路径（ mapping文件所在的目录 ）
            if (!"".equals(tf_inputSymbol.getText())){
                 file = new File(tf_inputSymbol.getText());
                //设置打开初始地址
                directoryChooser.setInitialDirectory(file);
            }
        }
        directoryChooser.setTitle("请选择mapping文件所在路径");
        File selectFile = directoryChooser.showDialog(stage);
        if (selectFile!=null){
            String path = selectFile.getPath();//选择的文件夹路径
            System.out.println("选择的mappping所在的文件夹地址为：" + path);
            tf_inputSymbol.setText(path);

            //获取文件夹下所有文件并打印路径
//            if(selectFile != null){
//                File[] files = selectFile.listFiles();
//                for(File f : files){
//                    System.out.println(f.getAbsolutePath());
//                }
//            }

        }
    }

    /**
     * 上传mapping
     *
     * @param actionEvent
     */
    public void commit(ActionEvent actionEvent) {
        String appid = tf_appid.getText().trim();
        String appkey = tf_appkey.getText().trim();
        String bundleid = tf_bundleid.getText().trim();
        String version = tf_version.getText().trim();
        String platform = tf_platform.getText().trim();
        String inputSymbol = tf_inputSymbol.getText().trim();
        String inputMapping = tf_inputMapping.getText().trim();

        //如果有数据为null就直接弹窗显示，不做处理
        if (checkConfigNull(appid, appkey, bundleid, version, platform, inputSymbol, inputMapping)) {
            return;
        }
        String commandStr = "java -jar buglyqq-upload-symbol.jar -appid %s -appkey %s -bundleid %s -version %s -platform %s -inputSymbol %s -inputMapping %s";
        commandStr = String.format(commandStr, appid, appkey, bundleid, version, platform, inputSymbol, inputMapping);

        String finalCommandStr = commandStr;

        new Thread(() -> {
            try {
                //java中执行cmd命令有两种方式：
                //方式一：老方式
                //执行命令
//                String[] cmds = {"cmd.exe","/k","start "+finalCommandStr};
//                Process process = Runtime.getRuntime().exec(cmds);
//                //打印数据
//                Scanner scanner = new Scanner(process.getInputStream());
//                while (scanner.hasNextLine()){
//                    System.out.println(scanner.nextLine());
//                }
//                scanner.close();
                //关闭进程
//                process.destroy();


                //方式二：新方式
//                这一行为测试cmd命令使用
//                ProcessBuilder pb = new ProcessBuilder("cmd","/k","ping 120.26.154.238");
//                pb.command("dir");

                //这里可以选择直接加载.bat批处理文件（ 批处理文件中可以写cmd命令的流程 ）
//                ProcessBuilder pb = new ProcessBuilder("cmd","/k","start C:\\exe.bat");
                //这里直接执行上传命令
                ProcessBuilder pb = new ProcessBuilder("cmd", "/k", "start " + finalCommandStr);

                //切换工作目录 （ 很重要，如果需要切到其它盘执行某些命令的话 ）
                //这里的目录地址一定是您下载腾讯bugly的工具jar地址
                pb.directory(new File("D://Programe File//buglyqq-upload-symbol"));
                Process process = pb.start();

                //打印数据
                byte[] bytePool = new byte[1024];
                StringBuffer stringBuffer = new StringBuffer();
                String line;
                InputStream inputStream = (process.getInputStream());
                while (inputStream.read(bytePool) != -11) {
                    line = new String(bytePool, "UTF-8");
                    System.out.println("取出的数据为：" + line);
                    stringBuffer.append(line);
                    stringBuffer.append("\n");
                }
                inputStream.close();
                //关闭进程
                process.destroy();

            } catch (Exception e) {

            }
        }).run();

        //主线程更新UI
//        Platform.runLater(()->{
//
//        });

    }

    private boolean checkConfigNull(String appid, String appkey, String bundleid, String version, String platform, String inputSymbol, String inputMapping) {

        boolean isconfigNull = false;

        if ("".equals(appid)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "appid不能未空");
            isconfigNull = true;
        }
        if ("".equals(appkey)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "appkey不能未空");
            isconfigNull = true;
        }
        if ("".equals(bundleid)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "bundleid（包名）不能未空");
            isconfigNull = true;
        }
        if ("".equals(version)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "version不能未空");
            isconfigNull = true;
        }
        if ("".equals(platform)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "平台不能未空");
            isconfigNull = true;
        }
        if ("".equals(inputSymbol)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "Mapping文件根路径不能未空");
            isconfigNull = true;
        }
        if ("".equals(inputMapping)) {
            simpleTools.informationDialog(Alert.AlertType.WARNING, "提示", "警告", "Mapping文件路径不能未空");
            isconfigNull = true;
        }
        return isconfigNull;
    }


}
